#pragma once

#include "prj_typedef.h"

// GNSS相关的配置
#define UART_TX_BUF_SIZE 1024                                  // UART TX buffer size, MUST BE POWER_OF_TWO
#define UART_RX_BUF_SIZE 512                                   // UART RX buffer size, MUST BE POWER_OF_TWO
#define UBX_OFFLINE_DATA_LEN_MAX 256                           //单条offline数据的长度最大值
#define UBX_OFFLINE_DATA_REPLY_LEN 14                          //模块回应FLASH数据的包的长度
#define UART_RECV_BUFFER_LEN UART_RX_BUF_SIZE                  //串口接收缓冲区长度
#define UART_RECV_TIMEOUT 500                                  //串口一帧超时时间
#define BLE_RECV_BUFFER_LEN (UBX_OFFLINE_DATA_LEN_MAX + 4 + 1) // BLE接收缓冲区长度，4是协议占用字节数，1为指令字节
#define BLE_RECV_TIMEOUT 1000                                  // BLE一帧超时时间

typedef struct
{
    // xxRMC:
    int16_t year;                            // UTC时间
    int8_t month, day, hour, minute, second; // UTC时间
    float longitude;                         //经度，东经为正数，西经为负数
    float latitude;                          //纬度，北纬为正数，南纬为负数
    float speed;                             //地面速率，单位m/s。原来为单位节，范围000.0~999.9节，1节的速度为：0.5144444m/s
    float course;                            //地面航向，单位度，范围000.0~359.9度，以真北方为参考基准

    // xxGGA:
    uint8_t satellites_tracked_num; //正在使用的用于定位的卫星数量
    uint8_t satellites_tracked[30]; //正在使用的用于定位的卫星编号
    float altitude;                 //海拔高度，范围-9999.9到9999.9米
    float height;                   //大地水准面高度，范围-9999.9到9999.9米

    // xxGSA:
    uint8_t fix_type;       //定位类型，1=未定位，2=2D定位，3=3D定位
    float pdop, hdop, vdop; //综合位置精度因子，水平精度因子，垂直精度因子，范围0.5~99.9

    // xxGSV:
    uint8_t satellites_in_view_num;    //可视卫星数量
    uint8_t satellites_in_view[30][2]; //可视卫星编号及其信噪比(C/No)，范围 0 到 99，单位dBHz

    //跟踪卫星和可视卫星信噪比
    uint8_t satellites_tracked_snr[30]; //正在跟踪的卫星的信噪比，0是无卫星
    uint8_t satellites_others_snr[30];  //未在跟踪的卫星的信噪比，0是无卫星

    //里程表
    uint32_t odometer;          //里程，单位m
    uint32_t odometer_accuracy; //里程精度，单位m

    bool is_fixed; //当前定位状态
} gnss_location_info_t;

typedef struct
{
    bool is_open;                 //当前初始化状态
    uint8_t sw_version[30];       //固件版本号
    uint8_t hw_version[10];       //硬件版本号
    uint8_t config_source;        //底层配置源，114:ROM, 111:OTP, 112:PINS, 102:FLASH
    uint8_t unique_id[5];         //唯一ID
    uint8_t otp_value[4];         // OTP
    bool stop_retrieve;           //中途停止检索
    uint32_t working_time_s;      // GNSS开始工作的时间
    bool is_model_started;        //数据运算是否已经调用开始
    bool is_new_location_for_use; //是否有新的定位信息，一般1s一次

    //里程表
    uint32_t odometer_init_value; //初始里程，单位m

    struct // LOG状态
    {
        bool is_log_created;        // LOG是否已经创建
        bool is_log_recording;      // LOG是否正在记录
        bool is_log_circular;       // LOG是否是环形LOG
        uint32_t filestoreCapacity; //文件存储的最大值
        uint32_t max_log_size;      //当前LOG允许存储的大小
        uint32_t current_log_size;  //当前LOG大小大概的存储空间
        uint32_t entry_count;       //词条数目
        uint32_t entry_count_got;   //已获取到的词条数目
    } log_state;

    struct //轨迹数据统计
    {
        bool is_statisticsing;    //是否正在统计
        uint32_t position_total;  //位置的总数量
        uint32_t position_index;  //位置的当前序号
        int32_t longitude_min;    // M8030输出的一组LOG的最小经度，东经为正数，西经为负数，单位10e-7度
        int32_t longitude_max;    // M8030输出的一组LOG的最大经度，东经为正数，西经为负数，单位10e-7度
        int32_t latitude_min;     // M8030输出的一组LOG的最小纬度，北纬为正数，南纬为负数，单位10e-7度
        int32_t latitude_max;     // M8030输出的一组LOG的最大纬度，北纬为正数，南纬为负数，单位10e-7度
        int32_t longitude_centre; //经度的中心点
        int32_t latitude_centre;  //纬度的中心点
        float coordinate_scale;   //坐标系的比例
        int64_t height_total;     //总海拔，单位mm
        int32_t height_average;   //平均海拔，单位mm
        int32_t height_last;      //上个点的海拔，单位mm
        int32_t height_uphill;    //上山高度，单位mm
        int32_t height_downhill;  //下山高度，单位mm
        uint32_t odometer_total;  //总里程表，单位m
    } statistics;
} gnss_state_info_t;

// M8030产测结果
typedef enum
{
    M8030_NOT_FOUND,
    M8030_OTP_ERROR,
    M8030_CHECKED_OK
} m8030_status_t;

extern gnss_location_info_t gnss_location_info_temp;
extern gnss_location_info_t gnss_location_info;
extern gnss_state_info_t gnss_state_info;
extern uint8_t ubx_assist_now_offline_data[UBX_OFFLINE_DATA_LEN_MAX];
extern uint32_t ubx_assist_now_offline_data_len;

void gnss_process(void);
void gnss_open(void);
void gnss_close(void);
void gnss_check_offline_data_mcu_based(void);
void gnss_set_upload_gnss_info(bool onoff);
m8030_status_t gnss_get_hw_status(void);
void gnss_init(void);
bool gnss_is_searching(void);
void gnss_switch_searching_to_start(void);
uint8_t gnss_if_agps_file_need_update(void);
void gnss_api_position_update(void);
void gnss_turn_on_nmea_msg(void);
void gnss_turn_off_nmea_msg(void);
